/**
 * 时间格式化  自定义格式+时区:当前|UTC
 * 		常用特定格式: 使用$.date()
 * @param date Date 时间对象
 * @param fmt string 格式化字符串(中午12点为下午)
 * 		- eg: "[Y]-[M]-[D] [H]:[I]:[S]"  []内可用KEY:
 * 		Y:年=2019  M:月=01开始  m:月=1开始  D:日=01  d:日=1
 * 		w:星期=1开始  H:24时=01  h:24时=1  I:分=01  i:分=1
 * 		S:秒=01  s:秒=1  MS:毫秒=001  ms:毫秒=1
 * 		A:上下午=A|P  a:上下午=a|p  G:12时=01  g:12时=1
 * 		z:时区=由getTimezoneOffset()取得的分钟数(西正,东负)
 * 		wx:星期=opt.w[idx:0开始]  mx:月=opt.m[idx:0开始]
 * @param opt json|null 选项
 * 		utc: boolean 是否取UTC时间  默认false:取当前时区
 * 		w: json|null 自定星期的文字映射  eg:[一,二,...]
 * 		m: json|null 自定月份的文字映射  eg:[一,二,...]
 * @return string  []包裹,不匹配的KEY,则不改变
 */
$.dateFmt = function(date, fmt, opt=null){
	const PRE=opt?.utc?'getUTC':'get', GET=k=>date[PRE+k]();
	return fmt.replace(/\[(.+?)]/g, (m,k)=>{
		switch(k){
			case 'Y': return GET('FullYear');
			case 'M': return $.pad(GET('Month')+1);
			case 'D': return $.pad(GET('Date'));
			case 'H': return $.pad(GET('Hours'));
			case 'I': return $.pad(GET('Minutes'));
			case 'S': return $.pad(GET('Seconds'));
			case 'MS': return $.pad(GET('Milliseconds'),3);
			case 'm': return GET('Month')+1;
			case 'd': return GET('Date');
			case 'h': return GET('Hours');
			case 'i': return GET('Minutes');
			case 's': return GET('Seconds');
			case 'ms': return GET('Milliseconds');
			case 'w': return GET('Day') || 7;
			case 'A': return GET('Hours')<12 ? 'A' : 'P';
			case 'a': return GET('Hours')<12 ? 'a' : 'p';
			case 'G': k=GET('Hours'); return $.pad(k<12?k:k-12);
			case 'g': k=GET('Hours'); return k<12 ? k : k-12;
			case 'z': return date.getTimezoneOffset();
			case 'wx': return opt.w[(GET('Day')||7)-1] || m;
			case 'mx': return opt.m[GET('Month')] || m;
			default: return m;
		}
	});
};
